事由是這樣的,有一封從Oracle DB的Procedure定時自動寄發的mail,在outlook中預覽內容時,只出現部份的內容,但是轉發給他人或另外存檔時,文字又可以正常呈現。
信件完整的內容應該如下:
花間一壺酒,獨酌無相親,
舉杯邀明月,對影成三人。
但是預覽的內容卻變成這樣:
花間一壺酒,獨酌無
原本以為是Outlook的問題,結果所有收到Oracle DB的Procedure寄的信的人都是這樣,但是從Oracle EBS寄出來的信卻是正常的。
後來把信件轉成文字檔並用文書編輯器把所有的字元(包含換行等)顯示出來後,終於發現是Oracle的程式的問題,其關鍵程式如下:
data0 := '花間一壺酒,獨酌無相親,' || chr(13)
data := data0 || '舉杯邀明月,對影成三人。'
因為chr(13)是回車,換行是chr(10),所以上述的程式寫錯了。
為了更了解chr(10)與chr(13)的差異,在網上找了一些資料來研究,自己記錄一下。
chr(10)表示換行line feed(\n),就是將游標往下移一行,但是不會移動到行首;
chr(13)則是回車carriage return(\r),就是將游標移動到當前的行首,但是不換行
在點陣式印表機下:
CR(chr(13)),印字頭回歸原位(最左邊),但不換行,所以會重疊印字
LF,即chr(10),就只是做換行動作,印字頭不回歸,會從上一行的行尾處換行列印,前面是空白的。
而在現今的電腦系統下,有些程式、平台對於chr(10)、chr(13)是一樣的處理,此時無論用chr(10)、chr(13)、chr(10)+chr(13)結果是一樣的。
而在Windows底下,正確的換行是\n\r,也就是chr(10)+chr(13)
因為Oracle Procedure是要寄給outlook的收件人,也就是windows系統,所以上述的程式我要改成下列:
data0 := '花間一壺酒,獨酌無相親,' || chr(10) ||chr(13)
data := data0 || '舉杯邀明月,對影成三人。'
重新測試後,outlook的預覽內容就正常呈現了。至於為什麼信件轉發後就會正常,我也不太清楚,也許是outlook的一個bug
此篇文章參考我的blog:https://blog.twtnn.com/